If one vcpu is executing ptc.g, while the other vcpu is executing itc,
the VHPT(VTLB) entry which should be purged may unexpectedly survive.
Then issue happens.
Signed-off-by: Anthony Xu <anthony.xu@intel.com>
else{
cch = __alloc_chain(hcb);
}
+ local_irq_disable();
*cch = *head;
head->page_flags=pte;
head->itir = rr.ps << 2;
head->next = cch;
head->len = cch->len+1;
cch->len = 0;
+ local_irq_enable();
return;
}
else {
cch = __alloc_chain(hcb);
}
- *cch = *hash_table;
- hash_table->page_flags = pte;
- hash_table->itir=itir;
- hash_table->etag=tag;
+ cch->page_flags = pte;
+ cch->itir = itir;
+ cch->etag = tag;
+ cch->next = hash_table->next;
+ wmb();
hash_table->next = cch;
- hash_table->len = cch->len + 1;
- cch->len = 0;
- return ;
+ hash_table->len += 1;
+ return;
}